package com.sojson.project.entity.po;

import java.io.IOException;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.sojson.base.impl.BaseOrder;
import com.sojson.constant.Constant;
import com.sojson.enums.EOrderStatusHotel;
import com.sojson.enums.core.EGeneralYesNo;
import com.sojson.enums.core.EPayStatus;
import com.sojson.enums.core.ERefundsStatus;
import com.sojson.util.DateUtil;
import com.sojson.util.id.IdUtil;
import com.sojson.util.token.TokenUtil;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;

/**
 * 入驻记录信息Bean
 * 
 * @author liu
 * @date 2021-07-02
 */
@ApiModel("入驻记录信息Bean")
public class HotelOrder extends BaseOrder {

    /**
     * 此文件由工具自动生成，手动添加内容请放至末尾
     */

    private static final long serialVersionUID = 1625212458409L;

    @ApiModelProperty("订单编号")
    private String no;
    @ApiModelProperty("用户编号")
    private String noUser;
    @ApiModelProperty("商家编号")
    private String noMerchant;
    @ApiModelProperty("房间编号")
    private String noRoom;
    @ApiModelProperty("显示价格")
    private BigDecimal priceShow;
    @ApiModelProperty("原价")
    private BigDecimal priceOriginal;
    @ApiModelProperty("订单价格")
    private BigDecimal price;
    @ApiModelProperty("优惠金额(优惠了多少)")
    private BigDecimal priceCoupon;
    @ApiModelProperty("优惠金额(逗号分隔)")
    private String priceCouponSplit;
    @ApiModelProperty("使用优惠券编号列表(逗号拼接)")
    private String nosCoupon;
    @ApiModelProperty("支付方式 1微信支付 2支付宝支付")
    private Integer payType;
    @ApiModelProperty("是否已付款(1:已付款,2:未付款)")
    private Integer isPay;
    @ApiModelProperty("支付单号(微信生成的支付订单)")
    private String noPay;
    @ApiModelProperty("微信支付单号")
    private String noPayWx;
    @ApiModelProperty("支付宝支付单号")
    private String noPayZfb;
    @ApiModelProperty("支付信息")
    private String msgPay;
    @ApiModelProperty("是否已退款(1:已退款,2:未退款,3:退款中)")
    private Integer isRefunds;
    @ApiModelProperty("退款单号")
    private String noRefund;
    @ApiModelProperty("退款金额")
    private BigDecimal priceRefund;
    @ApiModelProperty("退款信息")
    private String msgRefunds;
    @ApiModelProperty("状态(1:待付款,2:已付款待签合同,3:待入住,4:已入住,5:待评价,6:已完成,7:退款中,8:已关闭)")
    private Integer status;
    @ApiModelProperty("关闭类型(1:取消订单,2:仅退款(商家发起,不退优惠券))")
    private Integer closeType;
    @ApiModelProperty("是否入住中(1:是,2:否)")
    private Integer isCheck;
    @ApiModelProperty("关闭原因")
    private String msgClose;
    @ApiModelProperty("入住天数")
    private Integer day;
    @JsonFormat(pattern = "yyyy-MM-dd")
    @JSONField(format = "yyyy-MM-dd")
    @ApiModelProperty("开始时间")
    private Date startTime;
    @JsonFormat(pattern = "yyyy-MM-dd")
    @JSONField(format = "yyyy-MM-dd")
    @ApiModelProperty("结束时间")
    private Date endTime;
    @ApiModelProperty("付款时间")
    private Date payTime;
    @ApiModelProperty("成交时间")
    private Date successTime;
    @ApiModelProperty("订单结束时间")
    private Date orderEndTime;
    @ApiModelProperty("创建时间")
    private Date createdAt;
    @ApiModelProperty("更新时间")
    private Date updatedAt;
    @ApiModelProperty("订单表集合")
    private List<Integer> ids;
    @ApiModelProperty("订单编号集合")
    private List<String> nos;
    /** 入驻记录信息集合 */
    private List<HotelOrder> hotelOrders;

    /**
     * 以上由工具自动生成，以下为手动添加
     */

       /**
        * Empty constructor
        */
    public HotelOrder() {

    }

    /**
     * 此文件由工具自动生成，手动添加内容请放至末尾
     */

    /**
     * 获取 订单编号
     */
    @Override
    public String getNo() {
        return no;
    }

    /**
     * 设置 订单编号
     */
    @Override
    public void setNo(String no) {
        this.no = no;
    }

    /**
     * 获取 用户编号
     */
    public String getNoUser() {
        return noUser;
    }

    /**
     * 设置 用户编号
     */
    public void setNoUser(String noUser) {
        this.noUser = noUser;
    }

    /**
     * 获取 商家编号
     */
    public String getNoMerchant() {
        return noMerchant;
    }

    /**
     * 设置 商家编号
     */
    public void setNoMerchant(String noMerchant) {
        this.noMerchant = noMerchant;
    }

    /**
     * 获取 房间编号
     */
    public String getNoRoom() {
        return noRoom;
    }

    /**
     * 设置 房间编号
     */
    public void setNoRoom(String noRoom) {
        this.noRoom = noRoom;
    }

    /**
     * 获取 显示价格
     */
    public BigDecimal getPriceShow() {
        return priceShow;
    }

    /**
     * 设置 显示价格
     */
    public void setPriceShow(BigDecimal priceShow) {
        this.priceShow = priceShow;
    }

    /**
     * 获取 原价
     */
    public BigDecimal getPriceOriginal() {
        return priceOriginal;
    }

    /**
     * 设置 原价
     */
    public void setPriceOriginal(BigDecimal priceOriginal) {
        this.priceOriginal = priceOriginal;
    }

    /**
     * 获取 订单价格
     */
    public BigDecimal getPrice() {
        return price;
    }

    /**
     * 设置 订单价格
     */
    public void setPrice(BigDecimal price) {
        this.price = price;
    }

    /**
     * 获取 优惠金额(优惠了多少)
     */
    public BigDecimal getPriceCoupon() {
        return priceCoupon;
    }

    /**
     * 设置 优惠金额(优惠了多少)
     */
    public void setPriceCoupon(BigDecimal priceCoupon) {
        this.priceCoupon = priceCoupon;
    }

    /**
     * 获取 优惠金额(逗号分隔)
     */
    public String getPriceCouponSplit() {
        return priceCouponSplit;
    }

    /**
     * 设置 优惠金额(逗号分隔)
     */
    public void setPriceCouponSplit(String priceCouponSplit) {
        this.priceCouponSplit = priceCouponSplit;
    }

    /**
     * 获取 使用优惠券编号列表(逗号拼接)
     */
    public String getNosCoupon() {
        return nosCoupon;
    }

    /**
     * 设置 使用优惠券编号列表(逗号拼接)
     */
    public void setNosCoupon(String nosCoupon) {
        this.nosCoupon = nosCoupon;
    }

    /**
     * 获取 支付方式 1微信支付 2支付宝支付
     */
    public Integer getPayType() {
        return payType;
    }

    /**
     * 设置 支付方式 1微信支付 2支付宝支付
     */
    public void setPayType(Integer payType) {
        this.payType = payType;
    }

    /**
     * 获取 是否已付款(1:已付款,2:未付款)
     */
    public Integer getIsPay() {
        return isPay;
    }

    /**
     * 设置 是否已付款(1:已付款,2:未付款)
     */
    public void setIsPay(Integer isPay) {
        this.isPay = isPay;
    }

    /**
     * 获取 支付单号(微信生成的支付订单)
     */
    public String getNoPay() {
        return noPay;
    }

    /**
     * 设置 支付单号(微信生成的支付订单)
     */
    public void setNoPay(String noPay) {
        this.noPay = noPay;
    }

    /**
     * 获取 微信支付单号
     */
    public String getNoPayWx() {
        return noPayWx;
    }

    /**
     * 设置 微信支付单号
     */
    public void setNoPayWx(String noPayWx) {
        this.noPayWx = noPayWx;
    }

    /**
     * 获取 支付宝支付单号
     */
    public String getNoPayZfb() {
        return noPayZfb;
    }

    /**
     * 设置 支付宝支付单号
     */
    public void setNoPayZfb(String noPayZfb) {
        this.noPayZfb = noPayZfb;
    }

    /**
     * 获取 支付信息
     */
    public String getMsgPay() {
        return msgPay;
    }

    /**
     * 设置 支付信息
     */
    public void setMsgPay(String msgPay) {
        this.msgPay = msgPay;
    }

    /**
     * 获取 是否已退款(1:已退款,2:未退款,3:退款中)
     */
    public Integer getIsRefunds() {
        return isRefunds;
    }

    /**
     * 设置 是否已退款(1:已退款,2:未退款,3:退款中)
     */
    public void setIsRefunds(Integer isRefunds) {
        this.isRefunds = isRefunds;
    }

    /**
     * 获取 退款单号
     */
    public String getNoRefund() {
        return noRefund;
    }

    /**
     * 设置 退款单号
     */
    public void setNoRefund(String noRefund) {
        this.noRefund = noRefund;
    }

    /**
     * 获取 退款金额
     */
    public BigDecimal getPriceRefund() {
        return priceRefund;
    }

    /**
     * 设置 退款金额
     */
    public void setPriceRefund(BigDecimal priceRefund) {
        this.priceRefund = priceRefund;
    }

    /**
     * 获取 退款信息
     */
    public String getMsgRefunds() {
        return msgRefunds;
    }

    /**
     * 设置 退款信息
     */
    public void setMsgRefunds(String msgRefunds) {
        this.msgRefunds = msgRefunds;
    }

    /**
     * 获取 关闭类型(1:取消订单,2:仅退款(商家发起,不退优惠券))
     */
    public Integer getCloseType() {
        return closeType;
    }

    /**
     * 设置 关闭类型(1:取消订单,2:仅退款(商家发起,不退优惠券))
     */
    public void setCloseType(Integer closeType) {
        this.closeType = closeType;
    }

    /**
     * 获取 状态(1:待付款,2:已付款待签合同,3:待入住,4:已入住,5:待评价,6:已完成,7:退款中,8:已关闭)
     */
    public Integer getStatus() {
        return status;
    }

    /**
     * 设置 状态(1:待付款,2:已付款待签合同,3:待入住,4:已入住,5:待评价,6:已完成,7:退款中,8:已关闭)
     */
    public void setStatus(Integer status) {
        this.status = status;
    }

    /**
     * 获取 是否入住中(1:是,2:否)
     */
    public Integer getIsCheck() {
        return isCheck;
    }

    /**
     * 设置 是否入住中(1:是,2:否)
     */
    public void setIsCheck(Integer isCheck) {
        this.isCheck = isCheck;
    }

    /**
     * 获取 关闭原因
     */
    public String getMsgClose() {
        return msgClose;
    }

    /**
     * 设置 关闭原因
     */
    public void setMsgClose(String msgClose) {
        this.msgClose = msgClose;
    }

    /**
     * 获取 入住天数
     */
    public Integer getDay() {
        return day;
    }

    /**
     * 设置 入住天数
     */
    public void setDay(Integer day) {
        this.day = day;
    }

    /**
     * 获取 开始时间
     */
    public Date getStartTime() {
        return startTime;
    }

    /**
     * 设置 开始时间
     */
    public void setStartTime(Date startTime) {
        this.startTime = startTime;
    }

    /**
     * 获取 结束时间
     */
    public Date getEndTime() {
        return endTime;
    }

    /**
     * 设置 结束时间
     */
    public void setEndTime(Date endTime) {
        this.endTime = endTime;
    }

    /**
     * 获取 付款时间
     */
    public Date getPayTime() {
        return payTime;
    }

    /**
     * 设置 付款时间
     */
    public void setPayTime(Date payTime) {
        this.payTime = payTime;
    }

    /**
     * 获取 成交时间
     */
    public Date getSuccessTime() {
        return successTime;
    }

    /**
     * 设置 成交时间
     */
    public void setSuccessTime(Date successTime) {
        this.successTime = successTime;
    }

    /**
     * 获取 订单结束时间
     */
    public Date getOrderEndTime() {
        return orderEndTime;
    }

    /**
     * 设置 订单结束时间
     */
    public void setOrderEndTime(Date orderEndTime) {
        this.orderEndTime = orderEndTime;
    }

    /**
     * 获取 创建时间
     */
    public Date getCreatedAt() {
        return createdAt;
    }

    /**
     * 设置 创建时间
     */
    public void setCreatedAt(Date createdAt) {
        this.createdAt = createdAt;
    }

    /**
     * 获取 更新时间
     */
    public Date getUpdatedAt() {
        return updatedAt;
    }

    /**
     * 设置 更新时间
     */
    public void setUpdatedAt(Date updatedAt) {
        this.updatedAt = updatedAt;
    }

    /**
     * 获取 订单表集合
     */
    public List<Integer> getIds() {
        return ids;
    }

    /**
     * 设置 订单表集合
     */
    public void setIds(List<Integer> ids) {
        this.ids = ids;
    }

    /**
     * 获取 订单编号集合
     */
    public List<String> getNos() {
        return nos;
    }

    /**
     * 设置 订单编号集合
     */
    public void setNos(List<String> nos) {
        this.nos = nos;
    }

    /**
     * 获取 入驻记录信息集合
     */
    public List<HotelOrder> getHotelOrders() {
        return hotelOrders;
    }

    /**
     * 设置 入驻记录信息集合
     */
    public void setHotelOrders(List<HotelOrder> hotelOrders) {
        this.hotelOrders = hotelOrders;
    }

    @Override
    public Integer getBaseOrderType() {
        return null;
    }

    @Override
    public Integer getBasePayType() {
        return getPayType();
    }

    @Override
    public String getBaseOrderNo() {
        return getNo();
    }

    @Override
    public String getBaseOrderNoShop() {
        return getNo();
    }

    @Override
    public BigDecimal getBaseOrderTotal() {
        return getPrice();
    }

    @Override
    public BigDecimal getBasePayTotal() {
        return getPrice();
    }

    @Override
    public String getBaseRefundNo() {
        return getNoRefund();
    }

    @Override
    public BigDecimal getBaseRefundTotal() {
        return getPriceRefund();
    }

    /**
     * 以上由工具自动生成，以下为手动添加
     */

    /**
     * 插入初始化
     * @throws IOException 
     */
    public void insertInit() throws IOException {
        setNo(IdUtil.uuid());
        setNoUser(TokenUtil.getUserId());
        setIsPay(EPayStatus.NO.getCode());
        setIsRefunds(ERefundsStatus.NO.getCode());
        setStatus(EOrderStatusHotel.PAYMENT_NO.getCode());
        setIsCheck(EGeneralYesNo.NO.getCode());
        Date now = DateUtil.nowDate();
        setCreatedAt(now);
        setUpdatedAt(now);
        setOrderEndTime(new Date(now.getTime() + Constant.ORDER_PAY_TIME));
    }

    /**
     * 更新初始化
     */
    public void updateInit() {
        Date now = DateUtil.nowDate();
        setUpdatedAt(now);
    }

    /**
     * 更新初始化
     */
    public void setUpdateNull() {

    }

    /**
     * 退款初始化
     * 
     * @param orderNo       订单号
     * @param orderTotal    订单金额
     * @param refundNo      退款单号
     * @param refundTotal   退款金额
     * @param payType       支付类型
     */
    @Override
    public void refundInit(String orderNo, BigDecimal orderTotal, String refundNo, BigDecimal refundTotal,
        Integer payType) {
        setNo(orderNo);
        setPrice(orderTotal);
        setNoRefund(refundNo);
        setPriceRefund(refundTotal);
        setPayType(payType);
    }

}